/******************************
 判断数据类型
******************************/

const validate: Record<string, RegExp> = {
	email: /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
	mobile: /^0?1[3|4|5|6|7|8|9][0-9]\d{8}$/,
	tel: /^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$/,
	idcard: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
	url: new RegExp('^((https|http|ftp|rtsp|mms)?://)'
		+ '?(([0-9a-z_!~*\'().&=+$%-]+: )?[0-9a-z_!~*\'().&=+$%-]+@)?' //ftp的user@ 
		+ '(([0-9]{1,3}.){3}[0-9]{1,3}' // IP形式的URL- 199.194.52.184 
		+ '|' // 允许IP和DOMAIN（域名） 
		+ '([0-9a-z_!~*\'()-]+.)*' // 域名- www. 
		+ '([0-9a-z][0-9a-z-]{0,61})?[0-9a-z].' // 二级域名 
		+ '[a-z]{2,6})' // first level domain- .com or .museum 
		+ '(:[0-9]{1,4})?' // 端口- :80 
		+ '((/?)|' // a slash isn't required if there is no file name 
		+ '(/[0-9a-z_!~*\'().;?:@&=+$,%#-]+)+/?)$'),
}
// 检测字符串类型
// type: 检测类型
//       email : 邮箱
//       mobile : 手机号码
//       tel : 电话号码
//       idcard : 身份证号码
//       url : URL地址

/** 
 * 检测字符串类型
 * 考虑到（字母/中文/数字/特殊字符）等组合较多，再此方法不做检测
 * @param str {String} 传入待验证的字符串
 * @param type {string} 检测类型
 * @return {Boolean} 是否符合字符串类型
 */
const validStringType = (str: string, type: string): boolean => {
	let warnStr = `暂无 ${type} 类型的验证。
	验证的有效值为：`
	for (let _type in validate) {
		let reg = validate[_type]
		if (type === _type) {
			if (reg instanceof RegExp) {
				return reg.test(str)
			} else {
				console.error(`${type} 类型的判断内容并非 RegExp ，请及时修改。`)
				return false;
			}
		}
		warnStr += `${_type} / `
	}
	warnStr = warnStr.substring(0, warnStr.length - 3) + '。'
	console.warn(warnStr)
	return false;
}

/** 
 * 验证数据长度有效性
 * @param str {String} 需要验证的字符串
 * @param min {Number} 符合验证长度的最小值（-1则为不验证最小值）
 * @param max {Number} 符合验证长度的最大值（-1则为不验证最大值）
 * @return {Boolean} 是否符合验证长度
 */
const checkStringLength = (str: string, min: number = -1, max: number = -1): boolean => {
	max === -1 && (max = Infinity) // 正无穷大
	min === -1 && (min = -Infinity) // 负无穷大
	return str && str.toString().length <= max && str.toString().length >= min
}

let api = { validate, validStringType, checkStringLength }
window['_'] = Object.assign(window['_'] || {}, api)
export default api